/**
 * openaiService.js - OpenAI API服务
 * 提供与OpenAI API的通信功能
 */

import axios from 'axios';
import { ElMessage } from 'element-plus';

// API配置
// 从环境变量中读取后端API的基础URL，如 'http://localhost:8000/api'
const API_BASE_URL =
    import.meta.env.VITE_APP_API_BASE_URL;

// 读取API安全密钥，用于后端接口的身份验证
const API_SECRET =
    import.meta.env.VITE_APP_API_SECRET;

/**
 * 创建API实例
 * 通过自定义配置，为所有API请求提供统一的基础配置
 */
const api = axios.create({
    // 设置所有请求的基础URL前缀
    baseURL: API_BASE_URL,  // 明确添加 /api

    // 为每个请求默认添加的请求头
    headers: {
        // 指定请求体内容类型为JSON
        'Content-Type': 'application/json',

        // 自定义API密钥头，用于后端的接口验证
        'X-API-Secret': API_SECRET
    },

    // 允许跨域请求携带凭证（如Cookie）
    withCredentials: true,

    validateStatus: function (status) {
        console.log('Status:', status, "\nAPI_SECRET:", API_SECRET);
        return true; // 让所有状态码都被视为成功
    }
});

/**
 * 发送消息到OpenAI API
 * @param {string} message - 用户消息
 * @returns {Promise} API响应
 */
export const sendMessage = async (message) => {
    try {
        console.log('API Base URL:', API_BASE_URL);
        console.log('Axios Instance Base URL:', api.defaults.baseURL);
        console.log('Request URL:', '/api/chat/openai');

        console.log('Message Type:', typeof message);
        console.log('Message Content:', JSON.stringify(message, null, 2));

        // 确保message是数组格式
        const messageArray = Array.isArray(message) ? message : [{
            role: 'user',
            content: message
        }];

        const requestData = {
            messages: messageArray,
            model: "gpt-3.5-turbo",
            temperature: 0,
            stream: false,
            ...(typeof message === 'object' && message !== null ? message : {})
        };

        const response = await api.post('/api/chat/openai', requestData);
        console.log('响应状态:', response.status);
        console.log('错误信息:', JSON.stringify(response.data.error, null, 2));
        console.log('响应消息:', JSON.stringify(response.data.message, null, 2));

        if (response.data.error) {
            return {
                error: true,
                type: 'primary',
                message: response.data.message || 'API额度已用完，请检查账户余额和计费状态'
            };
        }

        return response.data;
    } catch (error) {
        const statusCode = error.response?.status;
        let errorMessage,openaitype;

        if (error.message && !error.response) {
            errorMessage = error.message;
        } else {
            switch (statusCode) {
                case 400:
                    errorMessage = '请求参数错误，请检查输入内容';
                    openaitype = 'error';
                    break;
                case 401:
                    errorMessage = 'token认证失败,请检查API密钥';
                    openaitype = 'error';
                    break;
                case 402:
                    errorMessage = '付款要求，请检查账户余额';
                    openaitype = 'primary';
                    break;
                case 429:
                    errorMessage = 'API额度已用完，请检查账户余额和计费状态';
                     openaitype = 'primary';
                    break;
                case 500:
                    errorMessage = '服务器内部错误，请稍后重试';
                     openaitype = 'error';
                    break;
                case 503:
                    errorMessage = '服务暂时不可用，请稍后重试';
                     openaitype = 'error';
                    break;
                default:
                    errorMessage = !navigator.onLine 
                        ? '网络连接失败，请检查网络设置'
                        : error.response?.data?.message || '请求失败，请稍后重试';
                     openaitype = 'error';
            }
        }

        return {
            error: true,
            type: openaitype,
            message: errorMessage
        };
    }
};

/**
 * 创建用户消息对象
 * @param {string} content - 用户消息内容
 * @returns {Object} 用户消息对象
 */
export const createUserMessage = (content) => ({
    role: 'user',
    content
});

/**
 * 创建助手消息对象
 * @param {string} content - 助手消息内容
 * @returns {Object} 助手消息对象
 */
export const createAssistantMessage = (content) => ({
    role: 'assistant',
    content
});